﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Linq;
using DevExpress.XtraEditors;
using Presupuestos.Negocio.Editables;
using Presupuestos.Negocio.SoloLectura;
using Presupuestos.Windows.Interfaces;
using Csla;
using Csla.Windows;

namespace Presupuestos.Windows.Configuraciones
{
    public partial class mntUsuarios : XtraUserControl, IMantenimiento
    {

        #region Declaración de Variables
        private Usuario m_Usuario;
        #endregion

        #region Constructor
        public mntUsuarios()
        {
            InitializeComponent();
        }
        #endregion

        #region Propiedades
        /// <summary>
        /// Instancia del Objeto Usuario
        /// </summary>
        public Usuario ObjetoUsuario
        {
            get { return m_Usuario; }
            set { m_Usuario = value; }
        }
        #endregion

        #region Miembros de IMantenimiento

        public void Nuevo(object sender, EventArgs e)
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;

                m_Usuario = Usuario.NewUsuario();
                usuarioBindingSource.DataSource = m_Usuario;

            }
            catch (DataPortalException ex)
            { MessageBox.Show(ex.BusinessException.Message, ex.BusinessException.Source, MessageBoxButtons.OK, MessageBoxIcon.Information); }
            catch (Exception ex)
            { MessageBox.Show(ex.Message, "Nuevo", MessageBoxButtons.OK, MessageBoxIcon.Information); }
            finally
            { this.Cursor = Cursors.Default; }

        }

        public void Editar(object sender, EventArgs e)
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;
                if (gdvUsuarios.SelectedRowsCount == 0)
                    throw new InvalidOperationException("Seleccione un registro!");

                var registro = (UsuarioInfo)gdvUsuarios.GetRow(gdvUsuarios.GetSelectedRows().First());
                if (registro != null)
                    m_Usuario = Usuario.GetUsuario(registro.IdUsuario);

                usuarioBindingSource.DataSource = m_Usuario;

            }
            catch (DataPortalException ex)
            { MessageBox.Show(ex.BusinessException.Message, "Editar", MessageBoxButtons.OK, MessageBoxIcon.Information); }
            catch (Exception ex)
            { MessageBox.Show(ex.Message, "Editar", MessageBoxButtons.OK, MessageBoxIcon.Information); }
            finally
            { this.Cursor = Cursors.Default; }

        }

        public void Eliminar(object sender, EventArgs e)
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;
                if (gdvUsuarios.SelectedRowsCount == 0)
                    throw new InvalidOperationException("Seleccione un registro!");

                if (MessageBox.Show("Desea Eliminar este registro?", "Confirme",
                    MessageBoxButtons.YesNo
                    , MessageBoxIcon.Question) == DialogResult.No)
                    return;

                var registro = (UsuarioInfo)gdvUsuarios.GetRow(gdvUsuarios.GetSelectedRows().First());
                if (registro != null)
                    Usuario.DeleteUsuario(registro.IdUsuario);

                ConError = false;

            }
            catch (DataPortalException ex)
            { MessageBox.Show(ex.BusinessException.Message, "Eliminar", MessageBoxButtons.OK, MessageBoxIcon.Information); }
            catch (Exception ex)
            { MessageBox.Show(ex.Message, "Eliminar", MessageBoxButtons.OK, MessageBoxIcon.Information); }
            finally
            { this.Cursor = Cursors.Default; }

        }

        public void Grabar(object sender, EventArgs e)
        {
            usuarioBindingSource.RaiseListChangedEvents = false;
            usuarioBindingSource.EndEdit();
            try
            {
                this.Cursor = Cursors.WaitCursor;
                m_Usuario.Save();
                ConError = false;
            }
            catch (DataPortalException ex)
            {
                MessageBox.Show(ex.BusinessException.Message,
                    "Grabar",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Information);
                ConError = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message,
                    "Grabar",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Information);
                ConError = true;
            }
            finally
            { this.Cursor = Cursors.Default; }

            usuarioBindingSource.RaiseListChangedEvents = true;
        }

        public void Cancelar(object sender, EventArgs e)
        {
            usuarioBindingSource.CancelEdit();
        }

        public void Actualizar(object sender, EventArgs e)
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;

                usuarioInfoListBindingSource.DataSource = UsuarioInfoList.GetUsuarioInfoList();

            }
            catch (DataPortalException ex)
            { MessageBox.Show(ex.BusinessException.Message, "Actualizar", MessageBoxButtons.OK, MessageBoxIcon.Information); }
            catch (Exception ex)
            { MessageBox.Show(ex.Message, "Actualizar", MessageBoxButtons.OK, MessageBoxIcon.Information); }
            finally
            { this.Cursor = Cursors.Default; }

        }

        public void Formulario(object sender, EventArgs e)
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;
                usuarioBindingSource.DataSource = m_Usuario;
                Actualizar(sender, e);
            }
            catch (DataPortalException ex)
            { MessageBox.Show(ex.BusinessException.Message, "Cargar", MessageBoxButtons.OK, MessageBoxIcon.Information); }
            catch (Exception ex)
            { MessageBox.Show(ex.Message, "Cargar", MessageBoxButtons.OK, MessageBoxIcon.Information); }
            finally
            { this.Cursor = Cursors.Default; }

        }

        public bool ConError { get; set; }

        #endregion
    }
}
